home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_200
/
260_01
/
sz.c
< prev
next >
Wrap
Text File
|
1988-02-23
|
40KB
|
1,636 lines
#define VERSION "sz 1.23 01-15-87"
#define PUBDIR "/usr/spool/uucppublic"
/*% cc -O -K -i -DCRCTABLE -DREADCHECK sz.c -lx -o sz; size sz
* sz.c By Chuck Forsberg
* MS-DOS version by Francois Bergeon
*
* cc -O sz.c -o sz USG (SYS III/V) Unix
* cc -O -DSVR2 sz.c -o sz Sys V Release 2 with non-blocking input
* Define to allow reverse channel checking
* cc -O -DV7 sz.c -o sz Unix Version 7, 2.8 - 4.3 BSD
* cl rz.c -link stty MS-DOS, MS-C 4.00+
*
* ln sz sb USG & V7
*
* define CRCTABLE to use table driven CRC
*
* ******* Some systems (Venix, Coherent, Regulus) do not *******
* ******* support tty raw mode read(2) identically to *******
* ******* Unix. ONEREAD must be defined to force one *******
* ******* character reads for these systems. *******
*
* A program for Unix to send files and commands to computers running
* Professional-YAM, PowerCom, YAM, IMP, or programs supporting Y/XMODEM.
*
* Sz uses buffered I/O to greatly reduce CPU time compared to UMODEM.
*
* USG UNIX (3.0) ioctl conventions courtesy Jeff Martin
*
* MS-DOS Adaptation 10-19-87 for the MS-C compiler rev 4.00+
* using Francois Bergeon's tty library
*/
char *substr(), *getenv();
#define LOGFILE "/tmp/szlog"
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <ctype.h>
#ifdef MSDOS
#include <time.h>
#define CRCTABLE
#define JAN1ST70 315532800 /* difference in seconds between */
/* Jan 1st 1980 & Jan 1st 1970 */
#endif
#define PATHLEN 256
#define OK 0
#define FALSE 0
#define TRUE 1
#define ERROR (-1)
#define HOWMANY 2
int Zmodem = 0; /* ZMODEM protocol requested */
unsigned Baudrate;
int Fromcu = 0; /* Were called from cu or yam */
#include "rbsb.c" /* most of the system dependent stuff here */
/*
* Attention string to be executed by receiver to interrupt streaming data
* when an error is detected. A pause (0336) may be needed before the
* ^C (03) or after it.
*/
#ifdef READCHECK
char Myattn[] = { 0 };
#else
#ifdef USG
char Myattn[] = { 03, 0336, 0 };
#else
char Myattn[] = { 0 };
#endif
#endif
FILE *in;
/* Ward Christensen / CP/M parameters - Don't change these! */
#define ENQ 005
#define CAN ('X'&037)
#define XOFF ('s'&037)
#define XON ('q'&037)
#define SOH 1
#define STX 2
#define EOT 4
#define ACK 6
#define NAK 025
#define CPMEOF 032
#define WANTCRC 0103 /* send C not NAK to get crc not checksum */
#define WANTG 0107 /* Send G not NAK to get nonstop batch xmsn */
#define TIMEOUT (-2)
#define RCDO (-3)
#define RETRYMAX 10
#define SECSIZ 128 /* cp/m's Magic Number record size */
#define KSIZE 1024
char Lastrx;
char Crcflg;
int Wcsmask = 0377;
int Verbose = 0;
int Modem = 0; /* MODEM - don't send pathnames */
int Restricted = 0; /* restricted; no /.. or ../ in filenames */
int Quiet = 0; /* overrides logic that would otherwise set verbose */
int Ascii = 0; /* Add CR's for brain damaged programs */
int Fullname = 0; /* transmit full pathname */
int Unlinkafter = 0; /* Unlink file after it is sent */
int Dottoslash = 0; /* Change foo.bar.baz to foo/bar/baz */
int firstsec;
int errcnt = 0; /* number of files unreadable */
int blklen = SECSIZ; /* length of transmitted records */
int Optiong; /* Let it rip no wait for sector ACK's */
int Noeofseen;
int Totsecs; /* total number of sectors this file */
char txbuf[KSIZE];
int Filcnt = 0; /* count of number of files opened */
int Lfseen = 0;
unsigned Rxbuflen = 16384; /* Receiver's max buffer length */
int Tframlen = 0; /* Override for tx frame length */
int blkopt = 0; /* Override value for zmodem blklen */
int Rxflags = 0;
int Wantfcs32 = TRUE; /* want to send 32 bit FCS */
char Lzconv; /* Local ZMODEM file conversion request */
char Lzmanag; /* Local ZMODEM file management request */
char Lztrans;
char zconv; /* ZMODEM file conversion request */
char zmanag; /* ZMODEM file management request */
char ztrans; /* ZMODEM file transport request */
int Command; /* Send a command, then exit. */
char *Cmdstr; /* Pointer to the command string */
int Cmdtries = 11;
int Cmdack1; /* Rx ACKs command, then do it */
int Exitcode;
int Testattn; /* Force receiver to send Attn, etc with qbf. */
char *qbf="The quick brown fox jumped over the lazy dog's back 1234567890\r\n";
long Lastread; /* Beginning offset of last buffer read */
int Lastc; /* Count of last buffer read or -1 */
int Dontread; /* Don't read the buffer, it's still there */
#ifndef MSDOS
jmp_buf tohere; /* For the interrupt on RX timeout */
#endif
jmp_buf intrjmp; /* For the interrupt on RX CAN */
/* called by signal interrupt or terminate to clean things up */
bibi(n)
{
canit();
fflush(stdout);
mode(0);
fprintf(stderr, "sz: caught signal %d; exiting\n", n);
#ifndef MSDOS
if (n == SIGQUIT)
abort();
#endif
exit(128+n);
}
/* Called when Zmodem gets an interrupt (^X) */
onintr()
{
signal(SIGINT, SIG_IGN);
longjmp(intrjmp, -1);
}
#ifndef MSDOS
#define sendline(c) putchar(c & Wcsmask)
#define xsendline(c) putchar(c)
flushmo()
{
fflush(stdout);
}
#else /* MSDOS */
#define sendline(c) xsendline(c & Wcsmask)
xsendline(c)
int c;
{
tty_write(iofd, &c, 1);
}
flushmo()
{
}
#endif
#define ZKER
int Zctlesc; /* Encode control characters */
int Nozmodem = 0; /* If invoked as "sb" */
char *Progname = "sz";
#include "zm.c"
main(argc, argv)
char *argv[];
{
char *cp;
int npats;
int agcnt;
char **agcv;
char **patts;
static char xXbuf[BUFSIZ];
if ((cp = getenv("ZNULLS")) && *cp)
Znulls = atoi(cp);
if ((cp = getenv("SHELL")) && (substr(cp, "rsh") || substr(cp, "rksh")))
Restricted = TRUE;
#ifndef MSDOS
chkinvok(argv[0]);
#else
Progname = "sz";
#endif
Rxtimeout = 600;
npats = 0;
if (argc < 2)
usage();
setbuf(stdout, xXbuf);
while (--argc)
{
cp = *++argv;
if (*cp++ == '-' && *cp)
{
while (*cp)
{
switch (*cp++)
{
case '+':
Lzmanag = ZMAPND;
break;
#ifndef MSDOS
case '1':
iofd = 1;
break;
#ifdef CSTOPB
case '2':
Twostop = TRUE;
break;
#endif
#else
case '2':
port = "COM2";
break;
case 's':
Baudrate = atoi(cp);
if ((speed = getspeed(Baudrate)) < 0)
usage();
cp = '\0';
break;
case 'Y':
Nozmodem = TRUE;
break;
#endif
case '7':
Wcsmask=0177;
break;
case 'a':
Lzconv = ZCNL;
Ascii = TRUE;
break;
case 'b':
Lzconv = ZCBIN;
break;
case 'C':
if (--argc < 1)
usage();
Cmdtries = atoi(*++argv);
break;
case 'i':
Cmdack1 = ZCACK1;
/* **** FALL THROUGH TO **** */
case 'c':
if (--argc != 1)
usage();
Command = TRUE;
Cmdstr = *++argv;
break;
case 'd':
++Dottoslash;